package Classes;

import java.io.Serializable;
import java.text.DateFormat;
import java.util.*;

/**
 * Classe que representa um usuario
 *
 * @author Lucas Marlon
 *
 */
public class Usuario implements Serializable {

    private Pessoa pessoa;
    private Ocupavel local;
    private String login, senha;
    private Date dataCadastro;
    private DateFormat f = DateFormat.getDateTimeInstance();
    private List<Atividade> historico;
    private List<Indicacao> indicacoes;
    private Usuario usuarioIndicado;

    /**
     * Construtor da classe
     *
     * @param pessoa Pessoa relacionado ao usuario
     * @param local Local ocupado pelo usuario
     * @param login Login do usuario
     * @param senha Senha do usuario
     */
    public Usuario(Pessoa pessoa, Ocupavel local, String login, String senha) {
        this.pessoa = pessoa;
        this.local = local;
        this.login = login;
        this.senha = senha;
        historico = new ArrayList<>();
        indicacoes = new ArrayList<>();
        dataCadastro = new Date(System.currentTimeMillis());
    }
    
    /**
     * Recupera a pessoa.
     * 
     * @return A pessoa.
     */
    public Pessoa getPessoa(){
        return this.pessoa;
    }
    
    /**
     * Recupera o local.
     * 
     * @return O local da estante do usuario.
     */
    public Ocupavel getLocal(){
        return this.local;
    }

    /**
     * Recupera a senha do usuario
     *
     * @return A senha do usuario
     */
    public String getSenha() {
        return senha;
    }

    /**
     * Altera a senha do usuario
     *
     * @param senha A senha do usuario
     */
    public void setSenha(String senha) {
        this.senha = senha;
    }

    /**
     * Recupera o login do usuario
     *
     * @return O login do usuario
     */
    public String getLogin() {
        return login;
    }

    /**
     * Recupera a lista de itens do usuario
     *
     * @return A lista de itens do usuario
     */
    public Estante getEstante() {
        return local.getEstante();
    }

    /**
     * Recupera a data de cadastro do usuario
     *
     * @return A data de cadastro do usuario
     */
    public String getDataCadastro() {
        return f.format(dataCadastro);
    }

    /**
     * Valida uma senha e o login dados
     *
     * @param loginASerTestado O login a ser testado
     * @param senhaASerTestada A senha a ser testada
     * @return Se o login e a senha estao corretos
     */
    public boolean validarLogin(String loginASerTestado, String senhaASerTestada) {
        return login.equals(loginASerTestado) && senha.equals(senhaASerTestada);
    }

    /**
     * Recupera o historico do usuario
     *
     * @return O historico do usuario
     */
    public List<Atividade> getHistorico() {
        return historico;
    }

    /**
     * Adiciona uma atividade ao historico
     *
     * @param atividade A atividade realizada pelo usuario
     */
    public void addAtividade(Atividade atividade) {
        historico.add(atividade);
    }

    /**
     * Recupera as indicacoes do usuario
     *
     * @return As indicacoes do usuario
     */
    public List<Indicacao> getIndicacoes() {
        return indicacoes;
    }

    /**
     * Adiciona uma indicacao na lista de indicacoes do usuario
     *
     * @param recomendacao Uma indicacao
     */
    public void addIndicacao(Indicacao recomendacao) {
        indicacoes.add(recomendacao);
    }    
    
    @Override
    public String toString() {
        return login + " " + senha;
    }
}